#!/usr/bin/env python
# -*-coding: utf-8 -*-
# Filename: modificar_clasificacion.py

##
# Módulos del sistema
# Parte gráfica
try:
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
except ImportError, error:
    print error
    print "Necesitas la librería gráficas gtk+pygtk"

##
# Módulos propios
try:
    from gui.msj_retroalimentacion import MensajeDeAdvertencia, MensajeDeError
    from lib.database import Clasificacion, GrupoDeResolucion, Ticket
    from lib.funciones_utiles import close, add_find_column
except ImportError, error:
    print error
    print "Error en modificar_clasificacion"

class ModificarClasificacion:
    def __init__(self, padre, clasificacion):
        self.gladefile = "gui/ghhp.glade"
        self.wTree = gtk.glade.XML(self.gladefile, "ModificarClasificacion")
        self.window = self.wTree.get_widget("ModificarClasificacion")
        #Establecemos el padre: !!!FIXME no anda en ningun caso
        self.padre = padre
        self.clasificacion = clasificacion
        self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
        self.window.set_transient_for(padre.window)
        self.un_dict = {"on_button117_clicked": self.agregar_grupo,
                "on_button118_clicked": self.quitar_grupo,
                "on_button93_clicked": self.verificar_datos,
                "on_button94_clicked": self.close,
                "on_button97_clicked": self.registrar_modificacion,
                "on_button98_clicked": self.close}
        self.window.resize(800, 350)
        self.label_codigo = self.wTree.get_widget("label482")
        self.label_codigo.set_text(str(clasificacion.id))
        self.entry_nombre = self.wTree.get_widget("entry97")
        self.combo_estado = self.wTree.get_widget("combobox8")
        self.combo_estado.set_model(gtk.ListStore(str))
        self.descripcion = self.wTree.get_widget("textview16")
        self.wTree.signal_autoconnect(self.un_dict)
        #cajas:
        self.hbox_138 = self.wTree.get_widget("hbox138")
        self.hbox_139 = self.wTree.get_widget("hbox139")
        #Grupos:
        self.grupos_activos_tree = self.wTree.get_widget("treeview36")
        self.grupos_asociados_tree = self.wTree.get_widget("treeview37")
        self.tree_confirmar = self.wTree.get_widget("treeview24")
        self.armar_lista_resultados()
        #Activos
        self.lista_grupos_activos = gtk.ListStore(str, str)
        self.grupos_activos_tree.set_model(self.lista_grupos_activos)
        # Asociados
        self.lista_grupos_asociados = gtk.ListStore(str, str)
        self.grupos_asociados_tree.set_model(self.lista_grupos_asociados)
        # Grupos confirmados
        self.lista_confirmados = gtk.ListStore(str, str)
        self.tree_confirmar.set_model(self.lista_confirmados)
        #Variables utiles
        self.grupos_activos = []
        self.grupos_asociados = []
        self.iterador_activo = {}
        self.iterador_asociado = {}
        self.armar_listas()
        self.armar_combo()
        self.nuevo_nombre = ''
        self.nuevo_estado = ''
        self.nueva_descripcion = ''
        self.nuevos_grupos = None
    
    def armar_combo(self):
        estados = ["Activa", "Desactiva"]
        for i, estado in enumerate(estados):
            self.combo_estado.append_text(estados[i])
        if self.clasificacion.estado:
            self.combo_estado.set_active(0)
        else:
            self.combo_estado.set_active(1)

    def armar_lista_resultados(self):
        lista = [self.grupos_activos_tree, self.grupos_asociados_tree,
                self.tree_confirmar]
        titulos = ["Codigo", "Nombre"]
        for tree in lista:
            for pos, titulo in enumerate(titulos):
                add_find_column(titulo, pos, tree)

    def armar_listas(self):
        """Llenara los trewiew"""
        # Grupos asociados
        for grupo in self.clasificacion.grupos:
            self.iterador_asociado[grupo.nombre]=self.lista_grupos_asociados.append(
                    [grupo.id, grupo.nombre])
            self.grupos_asociados.append(grupo)
        #Armamos listas
        # Grupos existentes
        grupos = GrupoDeResolucion.select()
        for grupo in grupos:
            if grupo not in self.grupos_asociados:
                self.iterador_activo[grupo.nombre]= self.lista_grupos_activos.append(
                        [grupo.id, grupo.nombre])
                self.grupos_activos.append(grupo)

    def agregar_grupo(self, widget):
        pos, seleccionado = self.un_grupo_seleccionado(1)
        if seleccionado:
            # Lo pasamos al de abajo y eliminamos uno arriba
            self.grupos_asociados.append(self.grupos_activos[pos])
            self.iterador_asociado[self.grupos_activos[pos].nombre]= (
                    self.lista_grupos_asociados.append(self.lista_grupos_activos[pos]))
            self.lista_grupos_activos.remove(self.iterador_activo[self.grupos_activos[pos].nombre])
            self.grupos_activos.remove(self.grupos_activos[pos])
            self.rearmar_grupos_activos()
        else:
            texto = "Debe seleccionar el Grupo a que quiere a la lista."
            msj = MensajeDeError(texto, self.window)
            msj.run()

    def un_grupo_seleccionado(self, lista):
        """Permite comprobar si selecciono un grupo de la lista."""
        dic = {1: self.grupos_activos_tree,
                2: self.grupos_asociados_tree}
        model, path = dic[lista].get_selection().get_selected_rows()
        if path:
            pos, = path[0]
            return pos, True
        else:
            return "", False

    def rearmar_grupos_activos(self):
        self.iterador_activo = {}
        self.lista_grupos_activos.clear()
        for grupo in self.grupos_activos:
            self.iterador_activo[grupo.nombre]= self.lista_grupos_activos.append(
                    [grupo.id, grupo.nombre])

    def quitar_grupo(self, widget):
        print "quiera grupo"
        pos, seleccionado = self.un_grupo_seleccionado(2)
        if seleccionado:
            if self.no_tiene_intervenciones_pendientes(self.grupos_asociados[pos]):
                print self.iterador_asociado
                self.grupos_activos.append(self.grupos_asociados[pos])
                self.lista_grupos_activos.append(self.lista_grupos_asociados[pos])
                self.lista_grupos_asociados.remove(self.iterador_asociado[self.grupos_asociados[pos].nombre])
                self.grupos_asociados.remove(self.grupos_asociados[pos])
                self.rearmar_grupos_asociados()
            else:
                error_1 = "No se puede eliminar el grupo poque tiene intervenciones"
                error_2 = "\npendientes de resolver con esta clasificacion"
                msj = MensajeDeError(error_1 + error_2, self.window)
        else:
            texto_1 = "Debe seleccionar un Grupo de la lista Grupos"
            texto_2 = "asociados\nque quiere quitar de la lista."
            msj = MensajeDeError(texto_1 + texto_2, self.window)
            msj.run()

    def no_tiene_intervenciones_pendientes(self, grupo):
        """Consulta si el grupo tiene intervenciones pendientes"""
        for intervencion in grupo.intervenciones:
            if intervencion.estado.True:#Probar
                return False
        return True

    def rearmar_grupos_asociados(self):
        self.iterador_asociado = {}
        self.lista_grupos_asociados.clear()
        for grupo in self.grupos_asociados:
            self.iterador_asociado[grupo.nombre] = (
                    self.lista_grupos_asociados.append([grupo.id,
                        grupo.nombre]))

    def verificar_datos(self, widget):
        self.nuevo_nombre, self.nueva_descripcion, self.nuevo_estado, bandera = self.datos_validos()
        if bandera:
            #Mostramos los datos para esperar la confirmacion
            print self.nuevo_nombre
            print self.nueva_descripcion
            print self.nuevo_estado
            self.nuevos_grupos = self.obtener_grupos_asociados()
            print self.nuevos_grupos
            """self.padre.grupo_de_resolucion.modificarClasificacion(self.clasificacion,
                    nombre, descripcion, estado, grupos_asociados)
            """
            self.wTree.get_widget("label485").set_text(
                    str(self.clasificacion.id))
            self.wTree.get_widget("label486").set_text(self.nuevo_nombre)
            self.wTree.get_widget("label492").set_text(self.nuevo_estado)
            self.wTree.get_widget("label487").set_text(self.nueva_descripcion)
            for grupo in self.nuevos_grupos:
                self.lista_confirmados.append([grupo.id, grupo.nombre])
            self.hbox_139.show()
            self.hbox_138.hide()
            self.window.resize(600, 300)
        else:
            error_1 = "Los siguientes campos no pueden ser nulos:"
            error_2 = "\n\t-Nombre.\n\t-Descripcion del alcance."
            msj = MensajeDeError(error_1+error_2, self.window)
            msj.run()

    def obtener_grupos_asociados(self):
        """Obtiene la lista de grupos asociados a la clasificacion"""
        #!!!FIXME_ probar con ^ en vez de |
        conjunto_1 = set(self.grupos_asociados)
        conjunto_2 = set(self.clasificacion.grupos)
        return conjunto_1 | conjunto_2 #new set with elements from both s and t

    def datos_validos(self):
        """Verifica Nombre, observacion, y ticket no cerrados"""
        model = self.combo_estado.get_model()
        index = self.combo_estado.get_active()
        estado = model[index][0]
        if estado == "Desactiva" and self.clasificacion.estado:
            #Quiere eliminar una clasificacion. Tenemos que fijarnos si hay
            #ticket abiertos todavia con esa clasificacion, sino msj Error
            tickets = Ticket.selectBy(cerrado=False)
            for ticket in tickets:
                if (self.clasificacion ==
                        ticket.historial_de_clasificacion[-1].clasificacion):
                    #Mensaje de error porque encontro ticket abierto
                    #con self.clasificacion
                    print "Error"
                    error = "No se puede desactivar la clasificacion.\nExisten ticket"
                    error_1 = " abiertos con esta clasificacion"
                    msj = MensajeDeError(error+error_1, self.window)
                    msj.run()
                    return "", "", "activaTodesactiva", False
                else:
                    #Se puede eliminar sin problemas
                    print "Se puede eliminar sin problemas"
                    nombre = self.entry_nombre.get_text()
                    desc = self.descripcion.get_buffer()
                    start = desc.get_start_iter()
                    end = desc.get_end_iter()
                    descripcion = desc.get_text(start, end)
                    #Faltan los grupos asociados
                    if nombre and descripcion:
                        return nombre, descripcion, estado, True
                    else:
                        return "", "", "", False
        else:
            nombre = self.entry_nombre.get_text()
            desc = self.descripcion.get_buffer()
            start = desc.get_start_iter()
            end = desc.get_end_iter()
            descripcion = desc.get_text(start, end)
            #Faltan los grupos asociados
            if nombre and descripcion:
                return nombre, descripcion, estado, True
            else:
                return "", "", "", False

    def registrar_modificacion(self, widget):
        if (self.nuevo_estado == "Desactiva" and
                self.clasificacion.estado):
            texto = "Esta operacion desactivará la clasificacion actual."
            texto_1 = "\nEn el futuro no se podra disponer de ella..."
            texto_3 = "\n¿Esta seguro que desea continuar con la operación?"
            msj = MensajeDeAdvertencia(texto + texto_1 + texto_3, self.window)
            if msj.msj.run() == gtk.RESPONSE_YES:
                print "Modificar clasificacion"
                msj.msj.destroy()
                self.padre.padre.grupo_de_resolucion.modificarClasificacion(
                        self.nuevo_nombre,
                        self.nuevo_estado,
                        self.nueva_descripcion,
                        self.nuevos_grupos,
                        self.clasificacion)
            else:
                msj.msj.destroy()
        else:
            print "Modificar la operacion"
            self.padre.padre.grupo_de_resolucion.modificarClasificacion(
                        self.nuevo_nombre,
                        self.nuevo_estado,
                        self.nueva_descripcion,
                        self.nuevos_grupos,
                        self.clasificacion)
            self.window.destroy()


    def close(self, widget):
        close(self.window)

